#ifndef __APP_DEVICE_H__
#define __APP_DEVICE_H__

#include "app_buffer.h"
#include <pthread.h>
#include "app_buffer.h"
#include "app_mqtt.h"
#include "app_message.h"
#include "app_pool.h"
#include "log.h"
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/input.h>
#include <pthread.h>

typedef struct
{
    char *dev_file_name;       // 设备文件名
    int dev_fd;                // 设备文件描述符
    buffer_t *up_buffer;       // 上行缓冲区
    buffer_t *down_buffer;     // 下行缓冲区
    pthread_t dev_read_thread; // 读取设备的线程
    // 根据不同的芯片，设置不同的u预处理
    int (*post_read)(char *, int);  // 读取设备后的回调函数
    int (*per_write)(char *, int); // 写入设备后的回调函数
    int is_running;                 // 设备当前的运行状态
    long last_write_ts_ms;          // 上次写入时间
    int write_interval_ms;          // 写入间隔
} device_t;

/**
 * @brief 设备初始化
 * @param 设备的文件地址
 * @return 设备结构体
 */
device_t *app_device_init(char *dev_file_name);

/**
 * @brief 启动设备读取操作
 * 1 启动从蓝牙串口中读取数据 （上行线路）
 * 2 向消息队列模块中注册接收数据后的处理数据函数 （下行线路开始）
 */
int app_device_start();

/**
 * @brief 停止设备读取操作
 */
void app_device_destroy();

/**
 * @brief 从蓝牙芯片中读取数据 （异步方法）1号
 */
void *app_device_read(void *arg);

/**
 * @brief 从缓冲区读取到数据写入到mqtt中 （异步方法，线程池执行）2号
 */
void *app_device_send2mqtt(void *arg);

/**
 * @brief 从mqtt中接收数据到缓冲区总 （注册给消息队列模块）3号
 */
int app_device_recv_from_mqtt(char *data, int len);

/**
 * @brief 向蓝牙芯片中写入数据 （异步方法 线程池执行）4号
 */
void *app_device_write(void *arg);

#endif /* __APP_DEVICE_H__ */
